/* *
* 策略模式是一种行为型设计模式，它定义了一系列的算法，并将每个算法都封装在单独的类中，从而使得它们可以互相替换。
* 策略模式使得算法可以独立于客户端而变化，也就是说，客户端可以基于不同的算法来选择不同的策略，而不需要改变客户端代码。
* 在策略模式中，有三个主要角色：
* 环境（Context）：负责维护一个指向策略对象的引用，同时负责向客户端提供可以选择的算法。
* 抽象策略（Strategy）：定义了所有具体策略的接口。
* 具体策略（Concrete Strategy）：实现了抽象策略的接口，并提供了具体的算法逻辑。
*       环境
*      抽象策略
* 具体策略1 具体策略2 ...
* 环境选择抽象策略 抽象策略包含了多种具体策略
* */

class Context {
    //? 接收策略
    constructor(strategy) {
        this.strategy = strategy
    }
    //? 调用具体策略
    pay(amount) {
        this.strategy.pay(amount)
    }
}
//? 抽象策略
class Strategy {
    pay(amount) {}
}
//? 具体策略1
class ConcreteStrategy1 extends Strategy{
    pay(amount) {
        super.pay(amount);
        console.log('具体策略1',amount)
    }
}
//? 具体策略2
class ConcreteStrategy2 extends Strategy{
    pay(amount) {
        super.pay(amount);
        console.log("具体策略2",amount)
    }
}

const two = new ConcreteStrategy2()
const one = new ConcreteStrategy1()

const context = new Context(one)
context.pay(1000)
context.strategy = two
context.pay(2000)
